// 执行命令  ts-node otherType.ts
// void  表示没有任何类型，和其他类型是平等关系，不能直接赋值:
function fun(): void {
  console.log("this is TypeScript");
};
// fun()

// never  类型表示的是那些永不存在的值的类型
// 异常
function err(msg: string): never { // OK
  throw new Error(msg); 
}
// 死循环
function loopForever(): never { // OK
  while (true) {};
}
// loopForever()
type Foo = string | number;
function controlFlowAnalysisWithNever(foo: Foo) {
  if (typeof foo === "string") {
    // 这里 foo 被收窄为 string 类型
  } else if (typeof foo === "number") {
    // 这里 foo 被收窄为 number 类型
  } else {
    // foo 在这里是 never
    const check: never = foo;
  }
}

// any
let b: any = 666;
b = "Semlinker";
b = false;
b = 66
b = undefined
b = null
b = []
b = {}

// unknown  unknown与any的最大区别是： 任何类型的值可以赋值给any，同时any类型的值也可以赋值给任何类型。unknown 任何类型的值都可以赋值给它，但它只能赋值给unknown和any
let notSure: unknown = 4;
let uncertain: any = notSure
// let uncertain: number = notSure Error
function getDog() {
  return '123'
}
  const dog: unknown = {hello: getDog};
// dog.hello(); // Error
 function getDogName() {
  let x: unknown;
  return x;
};
const dogName = getDogName();
// 直接使用
// const upName = dogName.toLowerCase(); // Error
// typeof
if (typeof dogName === 'string') {
  const upName = dogName.toLowerCase(); // OK
}
// 类型断言 
const upName = (dogName as string).toLowerCase(); // OK
 
// Number、String、Boolean、Symbol  不要使用对象类型来注解值的类型
// let num: Number; // Error

// object、Object 和 {}  小 object 代表的是所有非原始类型   大Object 代表所有拥有 toString、hasOwnProperty 方法的类型，所以所有原始类型、非原始类型都可以赋给 Object
let upperCaseObject: Object;
upperCaseObject = 1
upperCaseObject = {}
let upperCaseObject1: object = {}
upperCaseObject = upperCaseObject1


console.log('other type: ', )